/*
 * @Description:
 * @Author: william
 * @Date: 2025-01-22 15:12:19
 * @LastEditors: william
 * @LastEditTime: 2025-08-13 10:44:56
 */
import { resolve } from 'path'
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import basicSsl from '@vitejs/plugin-basic-ssl' // 自动生成证书

import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import Icons from 'unplugin-icons/vite'
import IconsResolver from 'unplugin-icons/resolver'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import { AntDesignXVueResolver } from 'ant-design-x-vue/resolver'

import VueDevTools from 'vite-plugin-vue-devtools'
import { visualizer } from 'rollup-plugin-visualizer'
import zipPack from 'vite-plugin-zip-pack'

const pathSrc = resolve(__dirname, 'src')
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  const env = loadEnv(mode, process.cwd())
  // console.log('VITE_APP_API_URL', env.VITE_APP_API_URL)

  return {
    base: './',
    resolve: {
      extensions: [
        '.mjs',
        '.js',
        '.mts',
        '.ts',
        '.jsx',
        '.tsx',
        '.json',
        '.vue'
      ],
      alias: {
        '@': pathSrc
      }
    },
    css: {
      // CSS 预处理器
      preprocessorOptions: {
        // 定义全局 SCSS 变量
        scss: {
          api: 'modern-compiler', // "modern-compiler" or "modern", "legacy"
          silenceDeprecations: ['legacy-js-api'],
          javascriptEnabled: true,
          additionalData: `@use "@/styles/_variables.scss" as *;`
        }
      }
    },
    server: {
      https: false,
      host: '0.0.0.0',
      port: 8082,
      open: false,
      hmr: {
        warnings: true,
        overlay: true
      },
      proxy: {
        '^/api/v1/auth|/api/v1/role|/api/v1/department|/api/v1/car|/api/v1/customer|/api/v1/hotel|/api/v1/travelagency|/api/v1/message|/api/v1/app|/api/v1/file|/api/v1/chat|/api/v1/sse|/sse/connect':
          {
            target: env.VITE_APP_API_URL, // 本地服务端口号
            logLevel: 'debug',
            changeOrigin: true
            // rewrite: path => path.replace(/^\/api\/v1/, '') // 路径重写-不需要处理
          },
        '^/api/v1/tenant/dropList|/api/v1/ai|/api/v1/ticket': {
          target: env.VITE_APP_API_URL, // 本地服务端口号
          logLevel: 'debug',
          changeOrigin: true
          // rewrite: path => path.replace(/^\/api\/v1/, '') // 路径重写-不需要处理
        },
        '^/api/v1/tenant|/api/v1/user': {
          target: env.VITE_APP_API_URL, // 本地服务端口号
          logLevel: 'debug',
          changeOrigin: true
          // rewrite: path => path.replace(/^\/api\/v1/, '') // 路径重写-不需要处理
        },
        '^/api/v1/car/vehicle/schedule': {
          target: env.VITE_APP_API_URL, // 本地服务端口号
          logLevel: 'debug',
          changeOrigin: true
          // rewrite: path => path.replace(/^\/api\/v1/, '') // 路径重写-不需要处理
        }
      }
    },
    plugins: [
      vue(),
      basicSsl(), // 自动生成自签名证书（推荐）
      VueDevTools(),
      // 自动导入配置 https://github.com/sxzz/element-plus-best-practices/blob/main/vite.config.ts
      AutoImport({
        // 导入 Vue 函数，如：ref, reactive, toRef 等
        imports: [
          'vue',
          // '@vueuse/core',
          'pinia',
          'vue-router',
          'vue-i18n',
          {
            '@/api/index.js': [['default', 'g_api']], // 接口模块
            '@/common/options.js': [['*', 'g_options']], // 下拉选项模块
            '@/common/rules.js': [['*', 'g_rules']], // 中英文字符串拼接模块
            '@/lang/index.js': [['default', 'g_i18n'], 'g_t'], // 全局国际化模块
            '@/router/index.js': [['default', 'g_router']], // 全局路由模块
            '@/store/index.js': [['default', 'g_store']], // 数据状态模块
            '@/styles/global.module.scss': [['default', 'g_style']], // 项目全局样式
            '@/utils/https.js': [
              ['default', 'g_https'],
              ['*', 'g_https']
            ], // https模块
            '@/utils/index.js': [['*', 'g_utils']] // 公共方法模块
          },
          {
            // 混淆模块
            '@/mixins/baseMap.js': ['useBaseMapMixin'], // 加载基础地图底层混淆模块
            '@/mixins/chartMixin.js': ['useChartMixin'], // 加载图表混淆模块
            '@/mixins/tableColumnWidth.js': ['useTableColumnWidth'] // 加载表格列混淆模块
          },
          {
            dayjs: [['default', 'g_dayjs']], // 日期处理模块
            '@/utils/_lodashEs.js': [['*', 'g_']], // 全局工具函数模块
            nzh: [
              ['default', 'g_nzh'],
              ['cn', 'g_nzhcn']
            ] // 数字转化中文模块
          }
        ],
        resolvers: [
          // 导入 Element Plus函数，如：ElMessage, ElMessageBox 等
          ElementPlusResolver(),
          // 自动导入图标组件
          IconsResolver({})
        ],
        dirs: ['./src/store/modules/**'],
        eslintrc: {
          enabled: true,
          filepath: './.eslintrc-auto-import.json',
          globalsPropValue: true
        },
        vueTemplate: true,
        // 导入函数类型声明文件路径 (false:关闭自动生成)
        // dts: false,
        dts: 'src/types/auto-imports.d.ts'
      }),
      Components({
        resolvers: [
          // 导入 Element Plus 组件
          ElementPlusResolver(),
          // 自动注册图标组件
          IconsResolver({
            enabledCollections: ['ep']
          }),
          AntDesignXVueResolver()
        ],
        // 指定自定义组件位置(默认:src/components)
        dirs: ['src/components'],
        // 允许子目录作为组件的命名空间前缀。
        directoryAsNamespace: false,
        // 折叠相同前缀（对大小写敏感）的文件夹和组件，
        // 以防止在命名空间组件名称中出现重复。
        // 当 `directoryAsNamespace: true` 时有效。
        collapseSamePrefixes: true,
        // 允许组件覆盖具有相同名称的其他组件。
        allowOverrides: false,
        // 导入组件类型声明文件路径 (false:关闭自动生成)
        // dts: false,
        dts: 'src/types/components.d.ts'
      }),
      Icons({
        autoInstall: true
      }),
      createSvgIconsPlugin({
        // 缓存图标位置
        iconDirs: [resolve(pathSrc, 'icons/svg')],
        symbolId: 'icon-[name]'
      }),
      visualizer({
        // open: mode === 'production',
        gzipSize: true, // 分析图生成的文件名
        brotliSize: true, // 收集 brotli 大小并将其显示
        filename: 'stats.html' // 分析图生成的文件名
      }),
      zipPack({
        inDir: 'dist', // 生成的web包根目录
        outDir: 'dist', // 生成zip的文件夹
        outFileName: 'dist.zip' // 生成zip的名称
      })
    ],
    // 预加载项目必需的组件
    optimizeDeps: {
      include: [
        'vue',
        'vue-router',
        'vue-i18n',
        'pinia',
        'axios',
        // '@vueuse/core',
        'path-to-regexp',
        'path-browserify',
        'echarts',
        'element-plus',
        'element-plus/es/components/form/style/css',
        'element-plus/es/components/form-item/style/css',
        'element-plus/es/components/button/style/css',
        'element-plus/es/components/input/style/css',
        'element-plus/es/components/input-number/style/css',
        'element-plus/es/components/switch/style/css',
        'element-plus/es/components/upload/style/css',
        'element-plus/es/components/menu/style/css',
        'element-plus/es/components/col/style/css',
        'element-plus/es/components/icon/style/css',
        'element-plus/es/components/row/style/css',
        'element-plus/es/components/tag/style/css',
        'element-plus/es/components/dialog/style/css',
        'element-plus/es/components/loading/style/css',
        'element-plus/es/components/radio/style/css',
        'element-plus/es/components/radio-group/style/css',
        'element-plus/es/components/popover/style/css',
        'element-plus/es/components/scrollbar/style/css',
        'element-plus/es/components/tooltip/style/css',
        'element-plus/es/components/dropdown/style/css',
        'element-plus/es/components/dropdown-menu/style/css',
        'element-plus/es/components/dropdown-item/style/css',
        'element-plus/es/components/sub-menu/style/css',
        'element-plus/es/components/menu-item/style/css',
        'element-plus/es/components/divider/style/css',
        'element-plus/es/components/card/style/css',
        'element-plus/es/components/link/style/css',
        'element-plus/es/components/breadcrumb/style/css',
        'element-plus/es/components/breadcrumb-item/style/css',
        'element-plus/es/components/table/style/css',
        'element-plus/es/components/tree-select/style/css',
        'element-plus/es/components/table-column/style/css',
        'element-plus/es/components/select/style/css',
        'element-plus/es/components/option/style/css',
        'element-plus/es/components/pagination/style/css',
        'element-plus/es/components/tree/style/css',
        'element-plus/es/components/alert/style/css',
        'element-plus/es/components/radio-button/style/css',
        'element-plus/es/components/checkbox-group/style/css',
        'element-plus/es/components/checkbox/style/css',
        'element-plus/es/components/tabs/style/css',
        'element-plus/es/components/tab-pane/style/css',
        'element-plus/es/components/rate/style/css',
        'element-plus/es/components/date-picker/style/css',
        'element-plus/es/components/notification/style/css',
        'element-plus/es/components/image/style/css',
        'element-plus/es/components/statistic/style/css',
        'element-plus/es/components/watermark/style/css',
        'element-plus/es/components/config-provider/style/css',
        'element-plus/es/components/text/style/css',
        'element-plus/es/components/drawer/style/css',
        'element-plus/es/components/color-picker/style/css',
        'element-plus/es/components/backtop/style/css',
        'element-plus/es/components/message-box/style/css',
        'element-plus/es/components/skeleton/style/css',
        'element-plus/es/components/skeleton/style/css',
        'element-plus/es/components/skeleton-item/style/css',
        'element-plus/es/components/badge/style/css',
        'element-plus/es/components/steps/style/css',
        'element-plus/es/components/step/style/css',
        'element-plus/es/components/avatar/style/css',
        'element-plus/es/components/descriptions/style/css',
        'element-plus/es/components/descriptions-item/style/css',
        'element-plus/es/components/checkbox-group/style/css',
        'element-plus/es/components/progress/style/css',
        'element-plus/es/components/image-viewer/style/css',
        'element-plus/es/components/empty/style/css'
      ]
    },
    // 构建配置
    build: {
      sourcemap: false,
      // target: 'es2019',
      outDir: 'dist',
      assetsDir: 'assets',
      chunkSizeWarningLimit: 1024, // 消除打包大小超过500kb警告
      minify: 'terser', // Vite 2.6.x 以上需要配置 minify: "terser", terserOptions 才能生效
      terserOptions: {
        compress: {
          keep_infinity: true, // 防止 Infinity 被压缩成 1/0，这可能会导致 Chrome 上的性能问题
          drop_console: true, // 生产环境去除 console
          drop_debugger: true // 生产环境去除 debugger
        },
        format: {
          comments: false // 删除注释
        }
      },
      rollupOptions: {
        treeshake: true, // 开启 Tree Shaking，消除未使用的代码，减小最终的包大小
        output: {
          manualChunks: {
            'vue-i18n': ['vue-i18n'],
            pinia: ['pinia'],
            'element-plus': ['element-plus'],
            echarts: ['echarts'],
            'lodash-es': ['lodash-es'],
            areaData: ['province-city-china/data'],
            // '@vueuse-core': ['@vueuse/core'],
            'chunk-lang': ['./src/lang/index.js'],
            'chunk-api': ['./src/api/index.js']
          },
          // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值
          entryFileNames: 'js/[name].[hash].js',
          // 用于命名代码拆分时创建的共享块的输出命名
          chunkFileNames: 'js/[name].[hash].js',
          // 用于输出静态资源的命名，[ext]表示文件扩展名
          assetFileNames: assetInfo => {
            const info = assetInfo.name.split('.')
            let extType = info[info.length - 1]
            if (
              /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(assetInfo.name)
            ) {
              extType = 'media'
            } else if (/\.(png|jpe?g|gif|svg)(\?.*)?$/.test(assetInfo.name)) {
              extType = 'img'
            } else if (/\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(assetInfo.name)) {
              extType = 'fonts'
            }
            return `${extType}/[name].[hash].[ext]`
          }
        }
      }
    }
  }
})
